
package com.ys.chatserver;

import com.eva.framework.WebListener;
import com.eva.framework.dbpool.DBShell;
import com.eva.framework.utils.LoggerFactory;
import com.ys.chatserver.cache.GroupsInfoCacheProvider;
import com.ys.chatserver.cache.GroupsMembersCacheProvider;
import com.ys.chatserver.cache.UsersInfoCacheProvider;
import com.ys.chatserver.http.file.TimmingRestoreImgAndVoice;
import com.ys.chatserver.http.logic.TimmingRestoreMessages;
import com.ys.chatserver.im.ChatServerLauncher;
import com.ys.chatserver.timer.OnlineTimer;
import net.ys.mobileimsdk.server.bak.ChatBak;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;

import javax.servlet.ServletContextEvent;

/**
 * 本类是RainbowChat的服务端Java Web模块的Listener实现类。
 * <p>
 * 对于JavaEE规范来说，Listener类会在Tomcat等应用服务器启动后自动被调用，所以RainbowChat
 * 服务端中某些需要自动启动的服务、守护线程等放在本类中启动和关闭即可。
 *
 * @author JackJiang
 * @since 1.0
 */
public class WebListenerEx extends WebListener {

    Logger logger = LoggerFactory.getLog();

    /**
     * The web module is ready to process requests.
     * {@inheritDoc}
     */
    public void contextInitialized(ServletContextEvent servletContextEvt) {
        Scheduler scheduler;
        try {
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            servletContextEvt.getServletContext().setAttribute("scheduler", scheduler);
            scheduler.start();
        } catch (SchedulerException e) {
            throw new RuntimeException(e);
        }
        super.contextInitialized(servletContextEvt);

        try {
            // 【重要】优先设置要连接的数据库类型（请根据您连接的DB类型正确地设置哦！）
//			DBShell.DB_TYPE = DBShell.DBType.sqlServer;
            DBShell.DB_TYPE = DBShell.DBType.mySql;
            // 启动定期转储过期图片、语音、短视频的处理线程
            if (!Boolean.parseBoolean(BaseConf.getInstance().getIS_BAK_SERVER())) {
                TimmingRestoreImgAndVoice.getInstance().start();
                // 启动定期转储过期聊天记录、离线消息的处理线程
                TimmingRestoreMessages.getInstance().start();
            }
            UsersInfoCacheProvider instance = UsersInfoCacheProvider.getInstance();
            instance.setNullForAllUserLatestLoginTime();
            // 载入用户基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
            instance.init();
            // 载入群基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
            GroupsInfoCacheProvider.getInstance().init();
            // 载入群成员列表高速缓存数据（保证系统群聊时的高性能）
            GroupsMembersCacheProvider.getInstance().init();
            // 启动IM实例（放最后启动时机刚好）
            ChatServerLauncher.getInstance().startup(scheduler);
            //备份服务不用启动实例
            if (!Boolean.parseBoolean(BaseConf.getInstance().getIS_BAK_SERVER())) {
               // new ChatBak().bakOutput();
            }
            // 备份恢复
            if (Boolean.parseBoolean(BaseConf.getInstance().getIS_BAK_SERVER())) {
              //  new ChatBak().bakRecover();
            }

            // 定时更新离线状态
            OnlineTimer.refreshOnlineStatus();

        } catch (Exception e) {
            System.err.println("[HTTP]【N】聊天服务器启动时出错，原因是:" + e.getMessage());
            logger.error(e.getMessage(), e);
        }
    }

    /**
     * The servlet context is about to be shut down.
     * {@inheritDoc}
     */
    public void contextDestroyed(ServletContextEvent servletContextEvt) {
        super.contextDestroyed(servletContextEvt);

        try {
            // 关闭IM实例（优先关闭，时机刚好）
            ChatServerLauncher.getInstance().shutdown();

            // 清除缓存
            UsersInfoCacheProvider.getInstance().removeAll();
            // 清除缓存
            GroupsInfoCacheProvider.getInstance().removeAll();
            // 清除缓存
            GroupsMembersCacheProvider.getInstance().removeAll();

            // 关闭定期转储过期图片和语音的处理线程
            TimmingRestoreImgAndVoice.getInstance().stop();
            // 关闭定期转储过期聊天记录、离线消息的处理线程
            TimmingRestoreMessages.getInstance().stop();
        } catch (Exception e) {
            System.err.println("[HTTP]【N】聊天服务器关闭时出错，原因是:" + e.getMessage());
            logger.error(e.getMessage(), e);
        }
    }

}
